import db from "../db";
import { Admin } from "../types/admin";
import { md5Encrypt } from "../utils/crypot";
import response from "../utils/response";
import { getReids, setReids } from "../utils/redis";
import { emailKey, sendEMail } from "../utils/sendemail";
import { getRefreshToken, getToken, refreshSecretKey } from "../utils/jwt";
import jwt from "jsonwebtoken";
import Captcha from "../utils/captcha";

/**
 * 管理员服务类，提供管理员相关的业务逻辑方法，如登录、注册、获取令牌等。
 */
class AdminService {
    /**
     * 获取所有管理员信息。
     * @returns 返回所有管理员的数据。
     */
    async getAllAdmin() {
        return db("demo_test").select();
    }

    /**
     * 管理员登录。
     * @param admin 管理员信息，包含姓名和密码。
     * @param uid 用户唯一标识，用于验证验证码。
     * @returns 如果登录成功，返回访问令牌和刷新令牌；否则返回错误信息。
     */
    async login(admin: Admin, uid: string) {
        const isAdmin = await db("demo_test").where({ name: admin.name }).first();
        if (!isAdmin) {
            return response.error("用户不存在");
        }
        if (isAdmin.password !== md5Encrypt(admin.password)) {
            return response.error("密码错误");
        }
        const isCode = await getReids(uid);
        if (!isCode || isCode !== admin.code) {
            return response.error("验证码错误");
        }
        return response.success({ accessToken: getToken(isAdmin as Admin), refeshToken: getRefreshToken(isAdmin.id) }, "登录成功");
    }

    /**
     * 管理员注册。
     * @param admin 管理员信息，包含姓名和密码。
     * @returns 如果注册成功，返回成功信息；否则返回错误信息。
     */
    async register(admin: Admin) {
        const isAdmin = await db("demo_test").where({ name: admin.name }).first();
        if (isAdmin) {
            return response.error("用户已存在");
        }
        admin.password = md5Encrypt(admin.password);
        const isCode = await getReids(emailKey(admin.email as string));
        if (!isCode || isCode !== admin.code) {
            return response.error("验证码错误");
        }
        return db("demo_test")
            .insert({ name: admin.name, password: admin.password })
            .then(() => {
                return response.success("注册成功");
            });
    }

    /**
     * 使用刷新令牌获取新的访问令牌。
     * @param refreshToken 刷新令牌。
     * @returns 如果令牌有效，返回新的访问令牌和刷新令牌；否则返回错误信息。
     */
    async getToken(refreshToken: string) {
        const data = jwt.verify(refreshToken, refreshSecretKey) as { id?: string };
        if (data.id) {
            const admin = await db("demo_test").where({ id: data.id }).first();
            if (!admin) {
                return response.error("未知的错误");
            } else {
                return response.success({ accessToken: getToken(admin as Admin), refeshToken: getRefreshToken(admin.id) }, "获取token成功");
            }
        }
        return response.error("无效的token");
    }

    /**
     * 发送验证邮件。
     * @param email 邮箱地址。
     * @param name 用户名。
     * @returns 返回发送邮件的结果信息。
     */
    async sendEmail(email: string, name: string) {
        const code = Math.random().toString().slice(2, 6);
        await setReids(emailKey(email), code, 300);
        const data = await sendEMail({ email, username: name }, code);
        return response.success(data, "发送成功");
    }

    /**
     * 发送验证码。
     * @param codeId 验证码标识。
     * @returns 返回验证码的图片数据。
     */
    async sendCaptcha(codeId: string) {
        const result = Captcha.getCode();
        const code = result.text.toLowerCase();
        await setReids(codeId, code);
        return result.data;
    }
}

export default new AdminService();
